package org.example.day04;

import java.util.HashSet;
import java.util.Set;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * <p>  警察在侦破一个案件时，得到了线人给出的可能犯罪时间，形如 “<span>HH:MM</span>” 表示的时刻。<span></span>  </p> 根据警察和线人的约定，为了隐蔽，该时间是修改过的，解密规则为：利用当前出现过的数字，构造下一个距离当前时间最近的时刻，则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。
 *
 * 警察在侦破一个案件时，得到了线人给出的可能犯罪时间，形如 “HH:MM” 表示的时刻。
 * 根据警察和线人的约定，为了隐蔽，该时间是修改过的，解密规则为：利用当前出现过的数字，
 * 构造下一个距离当前时间最近的时刻，则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。
 * @date 2024/3/11 15:22
 */
public class test062 {
    public static void main(String[] args) {
        // 输入时间
        String inputTime = "12:34";

        if (!isValidTime(inputTime)) {
            System.out.println("输入时间格式不合法");
        } else {
            String outputTime = getNextTime(inputTime);
            System.out.println(outputTime);
        }
    }

    private static boolean isValidTime(String time) {
        if (time.length() != 5 || time.charAt(2) != ':') {  // 检查时间字符串的长度和格式是否正确
            return false;
        }

        int hour = Integer.parseInt(time.substring(0, 2));  // 获取小时部分并转换为整数
        int minute = Integer.parseInt(time.substring(3));  // 获取分钟部分并转换为整数
        if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {  // 检查小时和分钟的取值范围是否合法
            return false;
        }

        return true;
    }

    private static String getNextTime(String current) {
        Set<Integer> digits = new HashSet<>();  // 用于记录当前时间中出现过的数字
        for (char ch : current.toCharArray()) {
            if (Character.isDigit(ch)) {  // 检查字符是否为数字
                digits.add(Character.getNumericValue(ch));  // 将数字添加到集合中
            }
        }

        int hour = Integer.parseInt(current.substring(0, 2));  // 获取当前时间的小时部分并转换为整数
        int minute = Integer.parseInt(current.substring(3));  // 获取当前时间的分钟部分并转换为整数
        while (true) {
            minute += 1;  // 增加一分钟
            if (minute >= 60) {  // 如果分钟超过60，则小时进位
                minute = 0;
                hour = (hour + 1) % 24;  // 将小时加1，并取余24，确保小时在0-23范围内
            }

            int h1 = hour / 10;  // 将小时分解为十位和个位
            int h2 = hour % 10;
            int m1 = minute / 10;  // 将分钟分解为十位和个位
            int m2 = minute % 10;

            // 检查当前时间的小时和分钟的十位和个位数字是否都出现过
            if (digits.contains(h1) && digits.contains(h2) && digits.contains(m1) && digits.contains(m2)) {
                return String.format("%02d:%02d", hour, minute);  // 构造下一个可能的犯罪时间
            }
        }
    }
}

